import { message } from 'ant-design-vue';

// 错误类型枚举
export enum ErrorType {
  NETWORK = 'network',
  VALIDATION = 'validation',
  BUSINESS = 'business',
  SYSTEM = 'system',
}

// 错误处理配置
interface ErrorConfig {
  showMessage?: boolean;
  logError?: boolean;
  retry?: boolean;
  retryCount?: number;
}

// 默认错误配置
const defaultConfig: ErrorConfig = {
  showMessage: true,
  logError: true,
  retry: false,
  retryCount: 3,
};

// 错误消息映射
const errorMessages = {
  [ErrorType.NETWORK]: {
    title: '网络错误',
    default: '网络连接失败，请检查网络设置',
  },
  [ErrorType.VALIDATION]: {
    title: '验证错误',
    default: '输入数据验证失败，请检查输入内容',
  },
  [ErrorType.BUSINESS]: {
    title: '业务错误',
    default: '操作失败，请稍后重试',
  },
  [ErrorType.SYSTEM]: {
    title: '系统错误',
    default: '系统异常，请联系管理员',
  },
};

// 全局错误处理函数
export function handleError(
  error: any,
  type: ErrorType = ErrorType.SYSTEM,
  config: ErrorConfig = {},
) {
  const finalConfig = { ...defaultConfig, ...config };

  // 获取错误信息
  const errorInfo = getErrorInfo(error, type);

  // 显示错误消息
  if (finalConfig.showMessage) {
    message.error(errorInfo.message);
  }

  // 记录错误日志
  if (finalConfig.logError) {
    console.error(`[${errorInfo.title}]`, error);
  }

  return errorInfo;
}

// 获取错误信息
function getErrorInfo(error: any, type: ErrorType) {
  const baseInfo = errorMessages[type];

  // 如果是已知错误类型，返回对应消息
  if (error?.code) {
    return {
      title: baseInfo.title,
      message: error.message || baseInfo.default,
      code: error.code,
    };
  }

  // 如果是网络错误
  if (type === ErrorType.NETWORK) {
    return {
      title: baseInfo.title,
      message: '网络连接超时，请检查网络设置',
      code: 'NETWORK_TIMEOUT',
    };
  }

  // 如果是验证错误
  if (type === ErrorType.VALIDATION) {
    return {
      title: baseInfo.title,
      message: error.message || '输入数据格式不正确',
      code: 'VALIDATION_ERROR',
    };
  }

  // 默认返回系统错误
  return {
    title: baseInfo.title,
    message: baseInfo.default,
    code: 'SYSTEM_ERROR',
  };
}

// API错误处理
export function handleApiError(error: any) {
  if (error?.response?.status) {
    const status = error.response.status;

    switch (status) {
      case 400:
        return handleError(error, ErrorType.VALIDATION);
      case 401:
        message.error('登录已过期，请重新登录');
        // 这里可以触发重新登录逻辑
        return;
      case 403:
        message.error('权限不足，无法执行此操作');
        return;
      case 404:
        message.error('请求的资源不存在');
        return;
      case 500:
        return handleError(error, ErrorType.SYSTEM);
      default:
        return handleError(error, ErrorType.NETWORK);
    }
  }

  return handleError(error, ErrorType.NETWORK);
}

// 表单验证错误处理
export function handleValidationError(errors: any[]) {
  const errorMessages = errors.map((error) => error.message).join('; ');
  message.error(`验证失败: ${errorMessages}`);
}

// 业务错误处理
export function handleBusinessError(error: any) {
  return handleError(error, ErrorType.BUSINESS);
}

// 网络错误处理
export function handleNetworkError(error: any) {
  return handleError(error, ErrorType.NETWORK);
}
